﻿package net.molchat.android.core;


import android.util.Log;
import net.molchat.android.dbase.RMS;
import net.molchat.android.scrn.Draw;


// ============================================================== Класс настроек
// All Static
/**
 * 
 */
public class Setting {

// Development mode settings

public static final String VER = "07.03.2014"; // DD.MM.YYYY

//public static boolean fLog = true; // Вести лог
public static boolean fLog = false; // Вести лог

//public static String server = "10.0.2.2"; // = localhost
public static String server = "chs.molchat.net"; // Сервер

public static int port = 9707; // Порт сервера

public static String login = "Tester07"; // Логин
public static String password = "1234"; // Пароль
//public static String login; // Логин
//public static String password; // Пароль


//Константы

public static final int COL_SCH_ONE_MAX = 3; // Макс. кол-во цветовых схем перс. контактов
public static final int COL_SCH_ROOM_MAX = 3; // Макс. кол-во цветовых схем комнат
public static final int MAX_ANI = 10; // Максимальное количество одновременно анимируемых смайлов
public static final int MAX_CACHE = 127; // Максимальное количество кешированных ников
public static final int MAX_FIND = 127; // Максимальное количество результатов поиска контактов
public static final int MAX_TEXT_LEN = 980; // Максимальная длина текста в сообщении
public static final int MAX_ROOM = 15; // Максимальное колмчество комнат
public static final int MAX_ONE = 239; // Максимальное кол-во персональных контактов
public static final int MAX_ONSCREEN = 40; // Максимальное кол-во сообщений на экране для одного контакта
public static final int MAX_TO_OUT = 5; // Длина очереди исходящих сообщений
public static final int TYPE = 1; // Тип клиента - телефон

//Номера настроек
public static final int CAM_IMG_ABIL = 60; // Возможные форматы снимков камеры
public static final int CAM_IMG_ENC = 61; // Формат снимков камеры
public static final int DISP_W = 15; // Размер экрана телефона
public static final int DISP_H = 16; // Размер экрана телефона
public static final int F_LOG = 20; // Вести лог
public static final int F_VIBRA = 11; // Вибрация
public static final int TIME_LOC_SHIFT = 30; // Смещение своих часов (в часах)
public static final int TIME_SER_SHIFT = 31; // Смещение часов сервера (в часах)
public static final int VOLUME = 12; // Громкость звука


// Настройки

// Animation speed
public static int tickSpeed = 48; // Скорость системных "тиков", мс. Должна быть кратна 16
public static int smlDivider = 2; // Smiles animates every smlDivider tick
public static int clkDivider = 20; // Clock animates every clkDivider tick
public static int touchDivider = 1; // Touch/drag animates every touchDivider tick
public static int keyDivider = 2; // Key stateNum detects every keyDivider tick


public static boolean fAnimate = true; // Анимировать смайлы (иначе - статичные)
//  private static final int cfAnimate = 0;
public static boolean fClk = true; // Отображать часы в углу
//  private static final int cfClk = 0;
public static boolean fClkSec = true; // Секунды на часах в углу
//  private static final int cfClkSec = 0;
public static boolean fGradient = true; // Использовать градиенты
//  private static final int cfGradient = 0;

public static boolean fRes = true; // Флаг подтверждения сообщений о доставке
//  private static final int cfRes = 0;

public static boolean fSmile = true; // Смайлы (если false - отображаются текстом)
//  private static final int cfSmile = 0;
//public static boolean fSound = true; // Звук
//private static final int cfSound = 13;
public static boolean fTime = true; // Отображать время в сообщениях
//  private static final int cfTime = 10;
public static boolean fVibra = true; // Вибрация

//Отображать входящие сообщения в заголовке во время ввода
public static final int F_SHOW_INCOMING = 14;

// Buttons
public static final int MAX_BTNS_PER_WIN = 4;
public static final int BTN_LAY_VER = 0;
public static final int BTN_LAY_HOR = 1;
public static int btnLayout = BTN_LAY_VER; // Button layout for graphic windows

public static boolean fShowIncoming = false;

public static String inick = " > "; // Разделитель ников
public static int inLoginLen = 3; // Длина ника для заголовка временного окна при входящем сообщении
//  private static final int cinLoginLen = 0;
public static int maxFind = 30; // Макс. кол-во контактов, возвращаемых при поиске
//  private static final int cMaxFind = 0;
public static String nickEnd = ": "; // Окончание ников
public static String servName = "Сервер"; // Название сервера

public static int timeLocShift = 2; // Смещение своих часов (в часах)

public static int timeSerShift = 0; // Смещение часов сервера (в часах)

public static int vibraMessTime = 80; // Длительность вибрации, мс
//  private static final int cVibraMessTime = 0;

public static int volume = 50; // Громкость звука

// Камера
public static String camImgEnc = null; // Формат снимков камеры
public static int camImgW = 160; // Ширина снимков камеры
public static int camImgH = 120; // Высота снимков камеры
public static int touchSpeedC = 2; // Touch screen moving speed coefficient

public static int waitShown = 15000; // Maximum time for waiting to be shown


//================================================================ Инициализация
private Setting() {

}


//================================================= Прочитать основные настройки
public static void loadCore() {

	byte[] bytes = Man.dbMan.load(RMS.SETT_CORE, 1);
	if (bytes != null) {
		FromBytes ser = new FromBytes(bytes, 0);

		login = ser.readString();
		password = ser.readString();
	}
	Man.dbMan.close();
}


//========================================================== Прочитать настройки
public static void fromBytes(byte[] from) {

	FromBytes ser = new FromBytes(from, 0);

	while (ser.pt < from.length) {
		switch (ser.readInt()) { // Номер настройки
		//			case F_LOG:
		//				fLog = ser.readBool();
		//				break;
			case F_VIBRA:
				fVibra = ser.readBool();
				break;
			case F_SHOW_INCOMING:
				fShowIncoming = ser.readBool();
				break;
			case VOLUME:
				volume = ser.readInt();
				break;
			case TIME_SER_SHIFT:
				timeSerShift = ser.readInt();
				break;
			case TIME_LOC_SHIFT:
				timeLocShift = ser.readInt();
				break;
			case Setting.CAM_IMG_ENC:
				camImgEnc = ser.readString();
				Log.v("Setting.fromBytes", "Оптимальная кодировка: " + camImgEnc);
				break;
		}
	}

}


//========================================================== Загрузить настройки
public static void loadMain() {

	byte[] bytes = Man.dbMan.load(RMS.SETT, 1);
	if (bytes != null) {
		fromBytes(bytes);
		Log.v("Setting.loadMain", "Настройки прочитаны");
	}
	Man.dbMan.close();
}


//================================================== Записать основные настройки
public static void saveCore() {

	ToBytes ser = new ToBytes();
	ser.writeString(login);
	ser.writeString(password);
	//	ser.writeString(server);
	//	ser.writeInt(port);
	Man.dbMan.save(RMS.SETT_CORE, ser.getResult(), 1);
}


//=========================================================== Записать настройки
public static void saveMain() {

	Man.dbMan.save(RMS.SETT, toBytes(new int[] { F_LOG, F_VIBRA, F_SHOW_INCOMING,
			VOLUME, TIME_SER_SHIFT, TIME_LOC_SHIFT }), 1);
	Log.v("Setting.saveMain", "Настройки сохранены");
}


//================================================================ Сериализовать
public static byte[] toBytes(int[] whats) {

	ToBytes ser = new ToBytes();

	for (int q = whats.length - 1; q >= 0; --q) {
		switch (whats[q]) {
			case Setting.DISP_W:
				ser.writeInt(Setting.DISP_W);
				ser.writeInt(Draw.dispW);
				break;
			case Setting.DISP_H:
				ser.writeInt(Setting.DISP_H);
				ser.writeInt(Draw.dispH);
				break;
			case Setting.F_LOG:
				ser.writeInt(Setting.F_LOG);
				ser.writeBool(fLog);
				break;
			case Setting.F_VIBRA:
				ser.writeInt(Setting.F_VIBRA);
				ser.writeBool(fVibra);
				break;
			case Setting.F_SHOW_INCOMING:
				ser.writeInt(Setting.F_SHOW_INCOMING);
				ser.writeBool(fShowIncoming);
				break;
			case Setting.VOLUME:
				ser.writeInt(Setting.VOLUME);
				ser.writeInt(volume);
				break;
			case Setting.TIME_SER_SHIFT:
				ser.writeInt(Setting.TIME_SER_SHIFT);
				ser.writeInt(timeSerShift);
				break;
			case Setting.TIME_LOC_SHIFT:
				ser.writeInt(Setting.TIME_LOC_SHIFT);
				ser.writeInt(timeLocShift);
				break;
			case Setting.CAM_IMG_ABIL:
				ser.writeInt(Setting.CAM_IMG_ABIL);
				//				ser.writeString(System.getProperty("video.snapshot.encodings"));
				ser.writeString(null);
				break;
			case Setting.CAM_IMG_ENC:
				ser.writeInt(Setting.CAM_IMG_ENC);
				ser.writeString(camImgEnc);
				break;
		}
	}

	return ser.getResult();
}


}
